Graphs

Relationship between Educational Attainment and GDP per Capita

Relationship between Educational Attainment and GDP per Capita by Continent

This version of Shiny is designed to work with 'htmlwidgets' >= 1.5.
    Please upgrade via install.packages('htmlwidgets').

Relationship between Educational Attainment and Child Mortality Rate by Continent

Relationship between Educational Attainment and Number of Workers in Family

Timeline Graph 1

primary_school %>%
  group_by(continent, year) %>%
  summarize(average = mean(primary_school)) %>%
  ggplot(aes(x=year,y=average, color=continent)) + 
  geom_point() + 
  geom_line() + 
  labs(x="Year", y="Average Rate of Educational Attainment", 
       title = "Educational Attainment over Time by Continent")

Map of World Educational Attainment

world <- primary_school %>%
  distinct(country)

map.world <- map_data("world")

world %>% 
  ggplot() +
  geom_map(data = map.world, map = map.world, 
           aes(map_id = region), fill = "white", color = "black") + 
  geom_map(aes(map_id = country), map = map.world) +
  expand_limits(x = map.world$long, y = map.world$lat) + # scale for fill
  theme_map() 






worldmap <- get_stamenmap(
    bbox = c(left = -180, bottom = -57, right = 179, top = 82.1), 
    maptype = "toner-background",
    zoom = 2
)
Source : http://tile.stamen.com/toner-background/2/0/0.png
Source : http://tile.stamen.com/toner-background/2/1/0.png
Source : http://tile.stamen.com/toner-background/2/2/0.png
Source : http://tile.stamen.com/toner-background/2/3/0.png
Source : http://tile.stamen.com/toner-background/2/0/1.png
Source : http://tile.stamen.com/toner-background/2/1/1.png
Source : http://tile.stamen.com/toner-background/2/2/1.png
Source : http://tile.stamen.com/toner-background/2/3/1.png
Source : http://tile.stamen.com/toner-background/2/0/2.png
Source : http://tile.stamen.com/toner-background/2/1/2.png
Source : http://tile.stamen.com/toner-background/2/2/2.png
Source : http://tile.stamen.com/toner-background/2/3/2.png
ggmap(worldmap)

primary_school %>%
  filter(decade == 1990) %>%
  group_by(decade, country) %>%
  summarize(average = mean(child_mortality)) %>%
  arrange(desc(average)) %>%
  filter(country==c("Niger", "Costa Rica")) 
longer object length is not a multiple of shorter object length

Tables

Mean Educational Attainment by Continent

primary_school <- primary_school %>%
  mutate(high_gdp = gdp_capita > 3955) 
# scatterplots to find interactions between variables
ggplot(primary_school, aes(x=gdp_capita, y=unemployment, color=high_gdp)) + geom_point()



# linear regression
library(broom)
tidy(lm(primary_school ~ high_gdp + unemployment, data=primary_school))

tidy(lm(primary_school ~ gdp_capita + unemployment + child_mortality, data=primary_school))

tidy(lm(primary_school ~ gdp_capita + unemployment + rural_pop, data=primary_school))

# an interaction effect will let one variable affect the other. Doesn't mean that the two variables are related
# coeff 0 -> no relationship
# less variables to fit b/c NA

country_list <- primary_school %>% 
  select(1:1) %>%
  distinct() 

save(country_list,file="country_list.Rda") 
  

## Map of World Educational Attainment
world <- primary_school %>%
  filter(year==c("2014","2015")) %>% 
  distinct(country)

map.world <- map_data("world")

world %>% 
  ggplot() +
  geom_map(data = map.world, map = map.world, 
           aes(map_id = region), fill = "white", color = "black") + 
  geom_map(aes(map_id = country), map = map.world) +
  expand_limits(x = map.world$long, y = map.world$lat) + # scale for fill
  theme_map() 






worldmap <- get_stamenmap(
    bbox = c(left = -180, bottom = -57, right = 179, top = 82.1), 
    maptype = "toner-background",
    zoom = 2
)

ggmap(worldmap)

primary_school %>%
  ggplot(aes(x=year, y=primary_school, color=high_gdp)) + 
  geom_jitter() +
  facet_wrap(~ high_gdp) +
  geom_smooth(se=FALSE)

plot <- ggplot(primary_school, aes(x=gdp_capita, y=primary_school, color=high_gdp)) + 
  geom_point() + 
  geom_smooth(method = "lm", se = FALSE) +
  labs(x="GDP per capita", y="Educational Attainment (Primary School)", 
       title="Educational Attainment and GDP per Capita by Continent")

ggplotly(plot)

NA

##Schooling Cost Graph

ggplot(primary_school,aes(x=schooling_cost,y=primary_school, color=high_gdp))+
  geom_point()+
  geom_smooth(method="lm", se=FALSE)

Gini

LS0tCnRpdGxlOiAiRGF0YSBTY2llbmNlIEZpbmFsIFByb2plY3QiCmF1dGhvcjogIkJsYWlyIENoYSwgS2FhcmluIEtoYW5kZWx3YWwsIER5bGFuIExhcnNlbiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGNvdW50cnljb2RlKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkod2VzYW5kZXJzb24pCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdndGhlbWVzKQpwcmltYXJ5X3NjaG9vbDAgPC0gcmVhZF9leGNlbCgicHJpbWFyeV9zY2hvb2wueGxzeCIpCnVyYmFuX3BvdmVydHkwIDwtIHJlYWRfZXhjZWwoInVyYmFuX3BvdmVydHkueGxzeCIpCnVuZW1wbG95bWVudDAgPC0gcmVhZF9leGNlbCgidW5lbXBsb3ltZW50Lnhsc3giKQpnZHBfY2FwaXRhMCA8LSByZWFkX2V4Y2VsKCJnZHBfY2FwaXRhLnhsc3giKQpjaGlsZF9tb3J0YWxpdHkwIDwtIHJlYWRfZXhjZWwoImNoaWxkX21vcnRhbGl0eS54bHN4IikKZmFtaWx5X3dvcmtlcnMwIDwtIHJlYWRfZXhjZWwoImZhbWlseV93b3JrZXJzLnhsc3giKQpydXJhbF9wb3AwIDwtIHJlYWRfZXhjZWwoInJ1cmFsX3BvcC54bHN4IikKc2Nob29saW5nX2Nvc3QwIDwtIHJlYWRfZXhjZWwoInNjaG9vbGluZ19jb3N0Lnhsc3giKQpgYGAKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQojIFJlYXNzZW1ibGluZyBlYWNoIGRhdGFzZXQgdG8gbG9uZ2VyIHN0eWxlCgpwcmltYXJ5X3NjaG9vbCA8LSBwcmltYXJ5X3NjaG9vbDAgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgIHZhbHVlc190bz0icHJpbWFyeV9zY2hvb2wiKSAlPiUKICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgoKdXJiYW5fcG92ZXJ0eSA8LSB1cmJhbl9wb3ZlcnR5MCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJ1cmJhbl9wb3ZlcnR5IikgJT4lCiAgICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgp1bmVtcGxveW1lbnQgPC0gdW5lbXBsb3ltZW50MCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJ1bmVtcGxveW1lbnQiKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCmdkcF9jYXBpdGEgPC0gZ2RwX2NhcGl0YTAgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgIHZhbHVlc190bz0iZ2RwX2NhcGl0YSIpICU+JQogICAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQoKY2hpbGRfbW9ydGFsaXR5IDwtIGNoaWxkX21vcnRhbGl0eTAgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgIHZhbHVlc190bz0iY2hpbGRfbW9ydGFsaXR5IikgJT4lCiAgICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgpmYW1pbHlfd29ya2VycyA8LSBmYW1pbHlfd29ya2VyczAgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgIHZhbHVlc190bz0iZmFtaWx5X3dvcmtlcnMiKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCnJ1cmFsX3BvcCA8LSBydXJhbF9wb3AwICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG89InJ1cmFsX3BvcCIpICU+JQogICAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQoKCnNjaG9vbGluZ19jb3N0IDwtIHNjaG9vbGluZ19jb3N0MCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJzY2hvb2xpbmdfY29zdCIpICU+JQogICAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQpgYGAKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQojIEpvaW5pbmcgZXZlcnkgZGF0YXNldCB0byBwcmltYXJ5X3NjaG9vbAoKcHJpbWFyeV9zY2hvb2wxIDwtIHByaW1hcnlfc2Nob29sICU+JQogIGlubmVyX2pvaW4odXJiYW5fcG92ZXJ0eSwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKHVuZW1wbG95bWVudCwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKGdkcF9jYXBpdGEsIGJ5ID0gYygieWVhciIsImNvdW50cnkiKSkgJT4lCiAgaW5uZXJfam9pbihjaGlsZF9tb3J0YWxpdHksIGJ5ID0gYygieWVhciIsImNvdW50cnkiKSkgJT4lCiAgaW5uZXJfam9pbihmYW1pbHlfd29ya2VycywgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKHJ1cmFsX3BvcCwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKHNjaG9vbGluZ19jb3N0LCBieSA9IGMoInllYXIiLCJjb3VudHJ5IikpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CiMgQWRkaW5nIGNvbnRpbmVudCB2YXJpYWJsZQoKbmV3ZGF0YSA8LSBkYXRhLmZyYW1lKGNvdW50cnk9cHJpbWFyeV9zY2hvb2wkY291bnRyeSkKbmV3ZGF0YSRjb250aW5lbnQgPC0gY291bnRyeWNvZGUoc291cmNldmFyID0gcHJpbWFyeV9zY2hvb2wkY291bnRyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbj0gImNvdW50cnkubmFtZSIsIGRlc3RpbmF0aW9uPSAiY29udGluZW50IikKbmV3ZGF0YTEgPC0gbmV3ZGF0YSAlPiUKICBzZWxlY3QoY29udGluZW50LCBjb3VudHJ5KSAlPiUKICBkaXN0aW5jdCgpCgpwcmltYXJ5X3NjaG9vbCA8LSBwcmltYXJ5X3NjaG9vbDEgJT4lCiAgaW5uZXJfam9pbihuZXdkYXRhMSwgYnk9ImNvdW50cnkiKSAlPiUKICBtdXRhdGUoZGVjYWRlID0gZmxvb3IoeWVhci8xMCkqMTApICU+JQogIGRyb3BfbmEocHJpbWFyeV9zY2hvb2wpIAoKVmlldyhwcmltYXJ5X3NjaG9vbCkKCiMgU3VnZ2VzdGlvbnM6IDEpIG1ha2Ugc29tZSB2YXJpYWJsZXMgY2F0ZWdvcmljYWwgKGNhdGVnb3J5IGNhbiBiZSAibWlzc2luZyB2YWx1ZSIpIDIpIGRvbid0IHVzZSB2YXJpYWJsZXMgd2l0aCB0b28gbWFueSBOQXMgMykgc2VsZWN0IHJhbmdlIG9mIHllYXJzIDQpIGZpbmQgb3RoZXIgbmV3IHZhcmlhYmxlcyAKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0Kc2F2ZShwcmltYXJ5X3NjaG9vbCxmaWxlPSJwcmltYXJ5X3NjaG9vbC5SZGEiKSAKI2xvYWQgaXQgd2l0aCBsb2FkKCJwcmltYXJ5X3NjaG9vbC5SZGEiKQpgYGAKCiMgR3JhcGhzCgojIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBHRFAgcGVyIENhcGl0YQoKCiMjIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEdEUCBwZXIgQ2FwaXRhIGJ5IENvbnRpbmVudApgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KcGxvdDEgPC0gZ2dwbG90KHByaW1hcnlfc2Nob29sLCBhZXMoeD1nZHBfY2FwaXRhLCB5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1jb250aW5lbnQpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKHg9IkdEUCBwZXIgY2FwaXRhIiwgeT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAoUHJpbWFyeSBTY2hvb2wpIiwgCiAgICAgICB0aXRsZT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgR0RQIHBlciBDYXBpdGEgYnkgQ29udGluZW50IikKCmdncGxvdGx5KHBsb3QxKQpgYGAKCiMjIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIENoaWxkIE1vcnRhbGl0eSBSYXRlIGJ5IENvbnRpbmVudApgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KcGxvdDIgPC0gZ2dwbG90KHByaW1hcnlfc2Nob29sLCBhZXMoeD1jaGlsZF9tb3J0YWxpdHksIHk9cHJpbWFyeV9zY2hvb2wsIGNvbG9yPWNvbnRpbmVudCkpKwogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gd2VzX3BhbGV0dGUobj01LCBuYW1lPSJNb29ucmlzZTMiKSkgKwogIGxhYnMoeD0iQ2hpbGQgTW9ydGFsaXR5IFJhdGUiLCB5PSJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQcmltYXJ5IFNjaG9vbCkiLCAKICAgICAgIHRpdGxlPSJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBDaGlsZCBNb3J0YWxpdHkgUmF0ZSBieSBDb250aW5lbnQiKQoKZ2dwbG90bHkocGxvdDIpCmBgYAoKIyMgUmVsYXRpb25zaGlwIGJldHdlZW4gRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgTnVtYmVyIG9mIFdvcmtlcnMgaW4gRmFtaWx5CmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQpwbG90MyA8LSBnZ3Bsb3QocHJpbWFyeV9zY2hvb2wsIGFlcyh4PWZhbWlseV93b3JrZXJzLCB5PXNjaG9vbGluZ19jb3N0LCBjb2xvcj1nZHBfY2FwaXRhKSkgKyAKICBnZW9tX3BvaW50KHNpemU9MiwgYWxwaGE9MC43KSArIAogIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJyZWQiLCBoaWdoPSJibHVlIikgKwogIGxhYnMoeD0iTnVtYmVyIG9mIFdvcmtlcnMgaW4gRmFtaWx5IiwgeT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAoUHJpbWFyeSBTY2hvb2wpIiwgCiAgICAgICB0aXRsZT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgTnVtYmVyIG9mIFdvcmtlcnMgaW4gRmFtaWx5IiwgY29sb3I9IkdEUCBwZXIgQ2FwaXRhIikKCmdncGxvdGx5KHBsb3QzKQpgYGAKCiMjIFRpbWVsaW5lIEdyYXBoIDEgCmBgYHtyfQpwcmltYXJ5X3NjaG9vbCAlPiUKICBncm91cF9ieShjb250aW5lbnQsIHllYXIpICU+JQogIHN1bW1hcml6ZShhdmVyYWdlID0gbWVhbihwcmltYXJ5X3NjaG9vbCkpICU+JQogIGdncGxvdChhZXMoeD15ZWFyLHk9YXZlcmFnZSwgY29sb3I9Y29udGluZW50KSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX2xpbmUoKSArIAogIGxhYnMoeD0iWWVhciIsIHk9IkF2ZXJhZ2UgUmF0ZSBvZiBFZHVjYXRpb25hbCBBdHRhaW5tZW50IiwgCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IG92ZXIgVGltZSBieSBDb250aW5lbnQiKQpgYGAKCgojIyBNYXAgb2YgV29ybGQgRWR1Y2F0aW9uYWwgQXR0YWlubWVudApgYGB7cn0Kd29ybGQgPC0gcHJpbWFyeV9zY2hvb2wgJT4lCiAgZGlzdGluY3QoY291bnRyeSkKCm1hcC53b3JsZCA8LSBtYXBfZGF0YSgid29ybGQiKQoKd29ybGQgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX21hcChkYXRhID0gbWFwLndvcmxkLCBtYXAgPSBtYXAud29ybGQsIAogICAgICAgICAgIGFlcyhtYXBfaWQgPSByZWdpb24pLCBmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siKSArIAogIGdlb21fbWFwKGFlcyhtYXBfaWQgPSBjb3VudHJ5KSwgbWFwID0gbWFwLndvcmxkKSArCiAgZXhwYW5kX2xpbWl0cyh4ID0gbWFwLndvcmxkJGxvbmcsIHkgPSBtYXAud29ybGQkbGF0KSArICMgc2NhbGUgZm9yIGZpbGwKICB0aGVtZV9tYXAoKSAKCgoKCgp3b3JsZG1hcCA8LSBnZXRfc3RhbWVubWFwKAogICAgYmJveCA9IGMobGVmdCA9IC0xODAsIGJvdHRvbSA9IC01NywgcmlnaHQgPSAxNzksIHRvcCA9IDgyLjEpLCAKICAgIG1hcHR5cGUgPSAidG9uZXItYmFja2dyb3VuZCIsCiAgICB6b29tID0gMgopCgpnZ21hcCh3b3JsZG1hcCkKYGBgCgoKCmBgYHtyfQpwcmltYXJ5X3NjaG9vbCAlPiUKICBmaWx0ZXIoZGVjYWRlID09IDE5OTApICU+JQogIGdyb3VwX2J5KGRlY2FkZSwgY291bnRyeSkgJT4lCiAgc3VtbWFyaXplKGF2ZXJhZ2UgPSBtZWFuKGNoaWxkX21vcnRhbGl0eSkpICU+JQogIGFycmFuZ2UoZGVzYyhhdmVyYWdlKSkgJT4lCiAgZmlsdGVyKGNvdW50cnk9PWMoIk5pZ2VyIiwgIkNvc3RhIFJpY2EiKSkgCmBgYAoKCgojIFRhYmxlcwojIyBNZWFuIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYnkgQ29udGluZW50CmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQpwcmltYXJ5X3NjaG9vbCAlPiUKICBncm91cF9ieShjb250aW5lbnQpICU+JQogIHN1bW1hcml6ZShwcmltYXJ5X3NjaG9vbF9tZWFuID0gbWVhbihwcmltYXJ5X3NjaG9vbCkpICU+JQogIGFycmFuZ2UoZGVzYyhwcmltYXJ5X3NjaG9vbF9tZWFuKSkKYGBgCgpgYGB7cn0KcHJpbWFyeV9zY2hvb2wgPC0gcHJpbWFyeV9zY2hvb2wgJT4lCiAgbXV0YXRlKGhpZ2hfZ2RwID0gZ2RwX2NhcGl0YSA+IDM5NTUpIApgYGAKCmBgYHtyfQojIHNjYXR0ZXJwbG90cyB0byBmaW5kIGludGVyYWN0aW9ucyBiZXR3ZWVuIHZhcmlhYmxlcwpnZ3Bsb3QocHJpbWFyeV9zY2hvb2wsIGFlcyh4PWdkcF9jYXBpdGEsIHk9dW5lbXBsb3ltZW50LCBjb2xvcj1oaWdoX2dkcCkpICsgZ2VvbV9wb2ludCgpCgoKIyBsaW5lYXIgcmVncmVzc2lvbgpsaWJyYXJ5KGJyb29tKQp0aWR5KGxtKHByaW1hcnlfc2Nob29sIH4gaGlnaF9nZHAgKyB1bmVtcGxveW1lbnQsIGRhdGE9cHJpbWFyeV9zY2hvb2wpKQoKdGlkeShsbShwcmltYXJ5X3NjaG9vbCB+IGdkcF9jYXBpdGEgKyB1bmVtcGxveW1lbnQgKyBjaGlsZF9tb3J0YWxpdHksIGRhdGE9cHJpbWFyeV9zY2hvb2wpKQoKdGlkeShsbShwcmltYXJ5X3NjaG9vbCB+IGdkcF9jYXBpdGEgKyB1bmVtcGxveW1lbnQgKyBydXJhbF9wb3AsIGRhdGE9cHJpbWFyeV9zY2hvb2wpKQoKIyBhbiBpbnRlcmFjdGlvbiBlZmZlY3Qgd2lsbCBsZXQgb25lIHZhcmlhYmxlIGFmZmVjdCB0aGUgb3RoZXIuIERvZXNuJ3QgbWVhbiB0aGF0IHRoZSB0d28gdmFyaWFibGVzIGFyZSByZWxhdGVkCiMgY29lZmYgMCAtPiBubyByZWxhdGlvbnNoaXAKIyBsZXNzIHZhcmlhYmxlcyB0byBmaXQgYi9jIE5BCgpjb3VudHJ5X2xpc3QgPC0gcHJpbWFyeV9zY2hvb2wgJT4lIAogIHNlbGVjdCgxOjEpICU+JQogIGRpc3RpbmN0KCkgCgpzYXZlKGNvdW50cnlfbGlzdCxmaWxlPSJjb3VudHJ5X2xpc3QuUmRhIikgCiAgCmBgYAoKYGBge3J9CgojIyBNYXAgb2YgV29ybGQgRWR1Y2F0aW9uYWwgQXR0YWlubWVudAp3b3JsZCA8LSBwcmltYXJ5X3NjaG9vbCAlPiUKICBmaWx0ZXIoeWVhcj09YygiMjAxNCIsIjIwMTUiKSkgJT4lIAogIGRpc3RpbmN0KGNvdW50cnkpCgptYXAud29ybGQgPC0gbWFwX2RhdGEoIndvcmxkIikKCndvcmxkICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoZGF0YSA9IG1hcC53b3JsZCwgbWFwID0gbWFwLndvcmxkLCAKICAgICAgICAgICBhZXMobWFwX2lkID0gcmVnaW9uKSwgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIikgKyAKICBnZW9tX21hcChhZXMobWFwX2lkID0gY291bnRyeSksIG1hcCA9IG1hcC53b3JsZCkgKwogIGV4cGFuZF9saW1pdHMoeCA9IG1hcC53b3JsZCRsb25nLCB5ID0gbWFwLndvcmxkJGxhdCkgKyAjIHNjYWxlIGZvciBmaWxsCiAgdGhlbWVfbWFwKCkgCgoKCgoKd29ybGRtYXAgPC0gZ2V0X3N0YW1lbm1hcCgKICAgIGJib3ggPSBjKGxlZnQgPSAtMTgwLCBib3R0b20gPSAtNTcsIHJpZ2h0ID0gMTc5LCB0b3AgPSA4Mi4xKSwgCiAgICBtYXB0eXBlID0gInRvbmVyLWJhY2tncm91bmQiLAogICAgem9vbSA9IDIKKQoKZ2dtYXAod29ybGRtYXApCmBgYAoKYGBge3J9CnByaW1hcnlfc2Nob29sICU+JQogIGdncGxvdChhZXMoeD15ZWFyLCB5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1oaWdoX2dkcCkpICsgCiAgZ2VvbV9qaXR0ZXIoKSArCiAgZmFjZXRfd3JhcCh+IGhpZ2hfZ2RwKSArCiAgZ2VvbV9zbW9vdGgoc2U9RkFMU0UpCmBgYAoKYGBge3J9CnBsb3QgPC0gZ2dwbG90KHByaW1hcnlfc2Nob29sLCBhZXMoeD1nZHBfY2FwaXRhLCB5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1oaWdoX2dkcCkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnMoeD0iR0RQIHBlciBjYXBpdGEiLCB5PSJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQcmltYXJ5IFNjaG9vbCkiLCAKICAgICAgIHRpdGxlPSJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBHRFAgcGVyIENhcGl0YSBieSBDb250aW5lbnQiKQoKZ2dwbG90bHkocGxvdCkKCmBgYAoKIyNTY2hvb2xpbmcgQ29zdCBHcmFwaAoKYGBge3J9CmdncGxvdChwcmltYXJ5X3NjaG9vbCxhZXMoeD1zY2hvb2xpbmdfY29zdCx5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1oaWdoX2dkcCkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpCmBgYAoKIyMgR2luaSAKCg==